/*
 * Title: 象棋（ Xiangqi）
 * Author: Yuanshun L
 * Created: 05-Otc-2021
 * Note: Only one codeing head read and one coding text read.
 * Progress: What are left is to consider two generals facing each other whitout any barrier.
 */

#include<stdio.h>
#include<string.h>

#define WIDTH 9
#define HEIGHT 10
char cchess[HEIGHT+1][WIDTH+1];
int record[HEIGHT+1][WIDTH+1];
int h,v,h2,v2;// (h,v)黑方将的位置，(h2,v2)红方帅的位置
int n,n2; // n棋子的数量,n2为黑方将可走的位置数量
struct{
    int x,y;
} r[4];

void print_record(){
    printf("------------recoder----------\n");
    for(int i=1;i<=HEIGHT;i++){
        for(int j=1;j<=WIDTH;j++){
            printf(" %d ",record[i][j]);
        }
        printf("\n");
    }
}
void print_chess(){
    printf("------------cchess----------\n");
    for(int i=1;i<=HEIGHT;i++){
        for(int j=1;j<=WIDTH;j++){
            if(cchess[i][j])
                printf(" %c ",cchess[i][j]);
            else{
                printf(" X ");
            }
        }
        printf("\n");
    }
}

void general_next_step(int x,int y){
    int k=0;
    if(x-1>=1){
        record[x-1][y]=1;
        r[k].x = x-1;r[k].y=y;
        k++;
    }
    if(x+1<=3){
        record[x+1][y]=1;
        r[k].x = x+1;r[k].y=y;
        k++;
    }
    if(y-1>=4){
        record[x][y-1]=1;
        r[k].x = x;r[k].y=y-1;
        k++;
    }
    if(y+1<=6){
        record[x][y+1]=1;
        r[k].x = x;r[k].y=y+1;
        k++;
    }
    n2 = k;
}

// 是否出现“撇马腿”情况，1代表没有出现，马可以走
int is_able_to_step(int x,int y,int direction){
    // 逆时针
    if(direction==1){ // 左上方向
        if(!cchess[x-1][y-1] && !cchess[x-1][y])
            return 1;
    }
    if(direction==11){ // 左上方向2
        if(!cchess[x-1][y-1] && !cchess[x][y-1])
            return 1;
    }
    if(direction==2){ // 左下方向
        if(!cchess[x+1][y-1] && !cchess[x+1][y])
            return 1;
    }
    if(direction==22){ // 左下方向2
        if(!cchess[x+1][y-1] && !cchess[x][y-1])
            return 1;
    }
    if(direction==3){ // 右下方向
        if(!cchess[x+1][y+1] && !cchess[x+1][y])
            return 1;
    }
    if(direction==33){ // 右下方向2
        if(!cchess[x+1][y+1] && !cchess[x][y+1])
            return 1;
    }
    if(direction==4){ // 右上方向
        if(!cchess[x-1][y+1] && !cchess[x-1][y])
            return 1;
    }
    if(direction==44){ // 右上方向2
        if(!cchess[x-1][y+1] && !cchess[x][y+1])
            return 1;
    }
    return 0;
}

// 寻找红方马的覆盖范围
void horse_covering_positions(int x,int y, int val){
    if(y-1>=1){
        if(x-2>=1 && is_able_to_step(x,y,1)){
            record[x-2][y-1]=val;
        }
        if(x+2<=HEIGHT && is_able_to_step(x,y,2)){
            record[x+2][y-1]=val;
        }
    }
    if(y+1<=WIDTH){
        if(x+2<=HEIGHT && is_able_to_step(x,y,3)){
            record[x+2][y+1]=val;
        }
        if(x-2>=1 && is_able_to_step(x,y,4)){
            record[x-2][y+1]=val;
        }
    }
    if(y-2>=1){
        if(x-1>=1 && is_able_to_step(x,y,11)){
            record[x-1][y-2]=val;
        }
        if(x+1<=HEIGHT && is_able_to_step(x,y,22)){
            record[x+1][y-2]=val;
        }
    }
    if(y+2<=WIDTH){
        if(x+1<=HEIGHT && is_able_to_step(x,y,33)){
            record[x+1][y+2]=val;
        }
        if(x-1>=1 && is_able_to_step(x,y,44)){
            record[x-1][y+2]=val;
        }
    }
}

void search_along_x_or_y_axis(int x,int y,int *flag,int val){
    // 找到一枚中间棋子
    if(cchess[x][y]) (*flag)++;

    // 当前正是找到的第二个棋子
    if((*flag)==2){
        // 如果该棋子是黑方的将军，则标记为是红方炮的射击范围
        if(x==h && y==v){
            (*flag)--;
            record[x][y]=val;
        }
    }

    // 已经在之前找到一枚中间棋子，并且当前位置为空
    if(*flag==1 && !cchess[x][y]){
        record[x][y] = val;
    }
}

// 寻找红方炮的射击范围
void cannon_covering_postions(int x,int y,int val){
    int flag;
    // 向上找
    if(x>1){
        flag=0; // 找到的中间棋子数
        for(int i=x-1;i>=1;i--){
            search_along_x_or_y_axis(i,y,&flag,val);
            if(flag>1) break;
        }
    }
    // 向下找
    if(x<HEIGHT){
        flag=0; // 找到的中间棋子数
        for(int i=x+1;i<=HEIGHT;i++) {
            search_along_x_or_y_axis(i, y, &flag,val);
            if (flag > 1) break;
        }
    }
    // 向左找
    if(y>1){
        flag=0;
        for(int i=y-1;i>=1;i--){
            search_along_x_or_y_axis(x, i, &flag,val);
            if (flag > 1) break;
        }
    }
    // 向右找
    if(y<WIDTH){
        flag=0;
        for(int i=y+1;i<=WIDTH;i++){
            search_along_x_or_y_axis(x, i, &flag,val);
            if (flag > 1) break;
        }
    }
}

void search_along_x_or_y_axis_2(int x,int y,int *flag,int val){
    // 搜索到一枚“拦路”棋子
    if(cchess[x][y]){
        (*flag)++;
    }
    // 分析找到的拦路棋子
    if(*flag){
        // 如果该棋子是黑方的将军，标记为覆盖范围的点
        if(x==h && y==v){
            (*flag)--;
            record[x][y]=val;
        }
    }
    // 如果该位置空，则为车的覆盖范围内的点
    if(!(*flag)){
        record[x][y]=val;
    }
}

// 寻找红方车的射击范围
void carriage_covering_postions(int x,int y,int val){
    int flag;
    // 往上找
    if(x>1){
        flag=0;
        for(int i=x-1;i>=1;i--) {
            search_along_x_or_y_axis_2(i,y,&flag,val);
            if(flag) break;
        }
    }
    // 往下找
    if(x<HEIGHT){
        flag=0;
        for(int i=x+1;i<=HEIGHT;i++) {
            search_along_x_or_y_axis_2(i,y,&flag,val);
            if(flag) break;
        }
    }
    // 往左找
    if(y>1){
        flag=0;
        for(int i=y-1;i>=1;i--) {
            search_along_x_or_y_axis_2(x,i,&flag,val);
            if(flag) break;
        }
    }
    // 往右找
    if(y<WIDTH){
        flag=0;
        for(int i=y+1;i<=WIDTH;i++) {
            search_along_x_or_y_axis_2(x,i,&flag,val);
            if(flag) break;
        }
    }

}


// 判断黑方可走的位置否是有红方棋子
int has_chess_round_black_general(){
    for(int i=0;i<n2;i++){
        if(cchess[r[i].x][r[i].y]){
            return 1;
        }
    }
    return 0;
}

int is_locked(){
    char temp;
    int  record_copy[HEIGHT+1][WIDTH+1];
    memcpy(record_copy,record,sizeof(record));
    // 黑方不可能吃掉红方棋子的情况
    if(!has_chess_round_black_general()){
        printf("黑方不可能吃掉红方棋子\n");
        for(int i=1;i<=3;i++){
            for(int j=4;j<=6;j++){
                if(record[i][j]==1)
                    return 0;
            }
        }
        return 1;
    }
    // 黑方可能吃掉红方棋子的情况
    else{
        printf("黑方可能吃掉红方棋子\n");
        for(int i=0;i<n2;i++){
            temp = cchess[r[i].x][r[i].y];
            // 吃掉棋子
            if(temp){
                memset(record,0,sizeof(record));
                cchess[r[i].x][r[i].y] = 'O';
                cchess[h][v] = '\0';
                for(int k=1;k<=HEIGHT;k++){
                    for(int k2=1;k2<=WIDTH;k2++){
                        if(cchess[k][k2] && cchess[k][k2]!='O'){
                            switch(cchess[k][k2]){
                                case 'R':
                                    carriage_covering_postions(k,k2,2);break;
                                case 'H':
                                    horse_covering_positions(k,k2,2);break;
                                case 'C':
                                    cannon_covering_postions(k,k2,2);break;
                            }
                        }// if
                    }// for
                }// for
                if(record[r[i].x][r[i].y]!=2){
                    printf("吃掉(%d,%d)的%c后危机化解\n",r[i].x,r[i].y,temp);
                    return 0;
                }
                cchess[r[i].x][r[i].y] = temp;
                cchess[h][v] = 'O';
            }// if
            // 不吃掉棋子，走空白的地方
            else{
                if(record_copy[r[i].x][r[i].y]!=2){
                    printf("可以走(%d,%d)\n",r[i].x,r[i].y);
                    return 0;
                }
            }
        }//for
        return 1;
    }
}



int main(){
    int x,y;
    char name[2];

    freopen("data.in","r",stdin);
    freopen("data.out","w",stdout);

    memset(cchess,'\0',sizeof(cchess));
    memset(record,0,sizeof(record));
    scanf("%d%d",&h,&v);
    scanf("%d%d",&h2,&v2);
    general_next_step(h,v);
    cchess[h][v] = 'O';

    scanf("%d",&n);
    while(n--){
        scanf("%s%d%d",name,&x,&y);
        cchess[x][y] = name[0];
        switch(name[0]){
            case 'R':
                carriage_covering_postions(x,y,2);break;
            case 'H':
                horse_covering_positions(x,y,2);break;
            case 'C':
                cannon_covering_postions(x,y,2);break;
        }
    }
//    print_chess();
//    print_record();


    // 讨论将帅是否照面的情况
    int occurance=0,flag=0; // 局面是否已经确定
    if(v==v2){
        // 查找是否有中间棋子
        for(int i=h+1;i<h2;i++){
            if(cchess[i][v]){
                occurance=1;
            }
        }
        // 没有中间棋子
        if(!occurance){
            flag=1;
            printf("将帅照面，且中间没有其他棋子\n");
            printf("No\n");
        }
        else{
            printf("将帅照面，且中间有其他棋子\n");
        }
    }

    // 局面没有确定
    if(!flag){
        if(is_locked()){
            printf("Yes\n");
        }
        else{
            printf("No\n");
        }
    }

    return 0;
}

